﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using BE;
using BE.SearchCriteria;

namespace DAL
{
    public class PedidoDAL : BaseDAL
    {
        public void InsertarPedido(PedidoBE Pedido)
        {
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cnn;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "Pedidos_i";
                    cmd.Parameters.Add(new SqlParameter("@IdVendedor", Pedido.pVendedorBE.IdVendedor ));
                    cmd.Parameters.Add(new SqlParameter("@IdCampaña", Pedido.pCampañaBE.IdCampaña));
                    cmd.Parameters.Add(new SqlParameter("@FechaPedido", Pedido.FechaPedido));
                    cmd.Parameters.Add(new SqlParameter("@CantidadArticulos", Pedido.CantidadArticulos ));
                    cmd.Parameters.Add(new SqlParameter("@Importe", Pedido.Importe));
                    cmd.Parameters.Add(new SqlParameter("@Estado", Pedido.Estado));

                    SqlParameter p = new SqlParameter();
                    p.ParameterName = "@IdPedido";
                    p.Direction = ParameterDirection.Output;
                    p.SqlDbType = SqlDbType.Int;
                    cmd.Parameters.Add(p);

                    cnn.Open();
                    cmd.ExecuteNonQuery();
                    Pedido.IdPedido = (Int32)cmd.Parameters["@IdPedido"].Value;
                }
                catch (Exception)
                {
                    throw;
                }

            }
        }

        public List<PedidoBE> SeleccionarPorParametros(BaseSC pFiltroSC, int pPageSize, int? pPageNum, ref int pCountReg)
        {
            PedidoSC wFiltroSC = (PedidoSC)pFiltroSC;
            if (wFiltroSC == null)
                wFiltroSC = new PedidoSC();

            List<PedidoBE> listaDePedidoBE = null;
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@IdPedido", wFiltroSC.IdPedido));
                cmd.Parameters.Add(new SqlParameter("@IdVendedor", wFiltroSC.IdVendedor));
                cmd.Parameters.Add(new SqlParameter("@Nombre", wFiltroSC.Nombre));
                cmd.Parameters.Add(new SqlParameter("@Apellido", wFiltroSC.Apellido));
                cmd.Parameters.Add(new SqlParameter("@NroDocumento", wFiltroSC.NroDocumento));
                cmd.Parameters.Add(new SqlParameter("@IdCampaña", wFiltroSC.IdCampaña));
                cmd.Parameters.Add(new SqlParameter("@Descripcion", wFiltroSC.Descripcion));
                cmd.Parameters.Add(new SqlParameter("@IdZona", wFiltroSC.IdZona));
                cmd.Parameters.Add(new SqlParameter("@FechaPedido", wFiltroSC.FechaPedido));
                cmd.Parameters.Add(new SqlParameter("@CantidadArticulos", wFiltroSC.CantidadAriticulos));
                cmd.Parameters.Add(new SqlParameter("@Importe", wFiltroSC.Importe));
                cmd.Parameters.Add(new SqlParameter("@Estado", wFiltroSC.Estado));
                cmd.Parameters.Add(new SqlParameter("@pagesize", pPageSize));
                cmd.Parameters.Add(new SqlParameter("@pagenum", pPageNum));

                SqlParameter p = new SqlParameter();
                p.ParameterName = "@PageCount";
                p.Direction = ParameterDirection.Output;
                p.SqlDbType = SqlDbType.Int;
                cmd.Parameters.Add(p);

                cmd.CommandText = "Pedidos_GetAllPaginated";
                cnn.Open();
                SqlDataReader reader = null;
                reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    listaDePedidoBE = new List<PedidoBE>();

                    while (reader.Read())
                    {
                        PedidoBE oPedidoBE = ConstruirPedido(reader);

                        listaDePedidoBE.Add(oPedidoBE);
                    }
                }
                reader.Close();
                pCountReg = (Int32)cmd.Parameters["@PageCount"].Value;

            }
            return listaDePedidoBE;
        }


        public PedidoBE SeleccionarPorId(PedidoBE pPedidoBE)
        {
            PedidoBE oPedidoBE = null;
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@IdPedido", pPedidoBE.IdPedido));
                cmd.CommandText = "Pedido_GetById";
                cnn.Open();
                SqlDataReader reader = null;
                reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    if (reader.Read())
                        oPedidoBE = ConstruirPedido(reader);
                }

            }
            return oPedidoBE;
        }

        private PedidoBE ConstruirPedido(SqlDataReader reader)
        {
            PedidoBE oPedidoBE = new PedidoBE();
            Object[] values = new Object[reader.FieldCount];

            reader.GetValues(values);

            oPedidoBE.IdPedido = Int32.Parse(reader["IdPedido"].ToString());
            oPedidoBE.FechaPedido = DateTime.Parse(reader["FechaPedido"].ToString());
            oPedidoBE.CantidadArticulos = Int32.Parse(reader["CantidadArticulos"].ToString());
            oPedidoBE.Importe = Decimal.Parse(reader["Importe"].ToString());
            oPedidoBE.Estado = Int32.Parse(reader["Estado"].ToString());
            oPedidoBE.pCampañaBE = new CampañaBE();
            if (reader["IdCampaña"] != DBNull.Value)
            {
                oPedidoBE.pCampañaBE.IdCampaña = Int32.Parse(reader["IdCampaña"].ToString());
                oPedidoBE.pCampañaBE.Descripcion = reader["Descripcion"].ToString();
            }
            oPedidoBE.pVendedorBE = new VendedorBE();
            if (reader["IdVendedor"] != DBNull.Value)
            {
                oPedidoBE.pVendedorBE.IdVendedor = Int32.Parse(reader["IdVendedor"].ToString());
                oPedidoBE.pVendedorBE.Apellido = reader["Apellido"].ToString();
                oPedidoBE.pVendedorBE.Nombre = reader["Nombre"].ToString();
                oPedidoBE.pVendedorBE.NroDocumento = reader["NroDocumento"].ToString();
                //oPedidoBE.oVendedorBE.PisoDpto = reader["PisoDpto"].ToString();
                //oPedidoBE.oVendedorBE.NroDocumento = reader["NroDocumento"].ToString();
                //oPedidoBE.oVendedorBE.Telefono = Convert.ToString(reader["Telefono"]);
                //oPedidoBE.oVendedorBE.FechaNacimiento = Convert.ToDateTime(reader["FechaNacimiento"]);
                //oPedidoBE.oVendedorBE.FechaAlta = Convert.ToDateTime(reader["FechaAlta"]);
                //oPedidoBE.oVendedorBE.Activo = Convert.ToBoolean(reader["Activo"]);
                //oPedidoBE.oVendedorBE.Deudor = Convert.ToBoolean(reader["Deudor"]);
                //oPedidoBE.oVendedorBE.Email = Convert.ToString(reader["Email"]);
            }

            return oPedidoBE;
        }


        public void ModificarPedido(PedidoBE Pedido)
        {
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cnn;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "Pedidos_u";
                    cmd.Parameters.Add(new SqlParameter("@IdPedido", Pedido.IdPedido));
                    cmd.Parameters.Add(new SqlParameter("@IdVendedor", Pedido.pVendedorBE.IdVendedor));
                    cmd.Parameters.Add(new SqlParameter("@IdCampaña", Pedido.pCampañaBE.IdCampaña));
                    cmd.Parameters.Add(new SqlParameter("@FechaPedido", Pedido.FechaPedido));
                    cmd.Parameters.Add(new SqlParameter("@CantidadArticulos", Pedido.CantidadArticulos));
                    cmd.Parameters.Add(new SqlParameter("@Importe", Pedido.Importe));
                    cmd.Parameters.Add(new SqlParameter("@Estado", Pedido.Estado));

                    cnn.Open();
                    cmd.ExecuteNonQuery();
                    
                }
                catch (Exception)
                {
                    throw;
                }

            }
        }
    }
}
